package com.example.springbooteasycode.aop;

import com.example.springbooteasycode.bootsocket.SocketServer;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.Arrays;

@Aspect
@Component // 切面必须被 Spring 管理
public class LogAAspect {

    @Around("@annotation(com.example.springbooteasycode.aop.LogA)") // 拦截 @LogA 注解的方法
    public Object aroundLogA(ProceedingJoinPoint joinPoint) throws Throwable {
        // 1. 获取端口信息（从 SocketServer 的 ThreadLocal 中）
        Integer clientPort = SocketServer.getClientPort();
        Integer serverPort = SocketServer.getServerPort();

        // 2. 获取请求信息（parseCommand 方法的入参）
        Object[] args = joinPoint.getArgs();
        String requestInfo = args.length > 0 ? new String((byte[]) args[0]) : "无请求数据";

        // 3. 打印日志（按需求处理业务）
        System.out.println("\n===== AOP 切面日志 =====");
        System.out.println("服务端端口：" + serverPort);
        System.out.println("客户端端口：" + clientPort);
        System.out.println("请求信息：" + requestInfo);

        // 4. 执行原方法（parseCommand）
        byte[] response = (byte[]) joinPoint.proceed();

        // 5. 处理响应信息
        System.out.println("响应信息：" + new String(response));
        System.out.println("=======================\n");

        return response;
    }
}
